package br.com.conciliador.cadastro.vo;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Formula;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Proxy;
import org.hibernate.annotations.Type;

import br.com.conciliador.cadastro.vo.filtro.FiltroContaBancoVo;
import br.com.conciliador.consulta.vo.ExtratoVo;
import br.com.r2.util.tipodado.Inteiro;
import br.com.r2.util.tipodado.InteiroLongo;
import br.com.r2.util.tipodado.Moeda;
import br.com.r2.util.tipodado.Texto;

@Entity
@Table(name = "DIM_CONTABANCO")
@Proxy(lazy = true)
public class ContaBancoVo implements Serializable
{

   /**
    * 
    */
   private static final long serialVersionUID = -6337662436999325603L;

   @Id
   @Column(name = "ID")
   @GeneratedValue(generator = "InteiroSequenceGenerator")
   @GenericGenerator(name = "InteiroSequenceGenerator", strategy = "br.com.r2.util.tipodado.hibernate.generator.InteiroSequenceGenerator")
   @Type(type = "br.com.r2.util.tipodado.hibernate.InteiroLongoUT")
   private InteiroLongo codigo;

   @Column(name = "DESCRICAO")
   @Type(type = "br.com.r2.util.tipodado.hibernate.TextoUT")
   private Texto descricao;

   @OneToMany(mappedBy = "extratoPK.conta", fetch = FetchType.LAZY)
   @Cascade(CascadeType.ALL)
   private List<ExtratoVo> listaLancamentos;

   @Formula("BANCO || '/' || AGENCIA || '/' || CONTA")
   @Type(type = "br.com.r2.util.tipodado.hibernate.TextoUT")
   private Texto bancoAgenciaConta;

   @Column(name = "BANCO")
   @Type(type = "br.com.r2.util.tipodado.hibernate.InteiroUT")
   private Inteiro banco;

   @Column(name = "AGENCIA")
   @Type(type = "br.com.r2.util.tipodado.hibernate.InteiroUT")
   private Inteiro agencia;

   @Column(name = "CONTA")
   @Type(type = "br.com.r2.util.tipodado.hibernate.InteiroLongoUT")
   private InteiroLongo conta;

   @OneToMany(mappedBy = "contaBancoVo", fetch = FetchType.LAZY)
   @Cascade(CascadeType.ALL)
   private List<ContaBancoEstLojaVo> listaContaEstLojas;

//   @ManyToOne(fetch = FetchType.LAZY)
//   @JoinColumn(name = "EST_LOJA")
//   private EstLojaVo estLojaVo;

//   @ManyToOne(fetch = FetchType.LAZY)
//   @JoinColumn(name = "DIM_CONTABANCO")
//   private EstLojaVo estLojaVo;

   @Transient
   private Moeda creditos;

   @Transient
   private Moeda debitos;

   @Transient
   private Moeda saldo;

   @Transient
   private boolean exibirListaLancamentos;

   @Transient
   private FiltroContaBancoVo filtro;

   public InteiroLongo getCodigo()
   {
      return codigo;
   }

   public void setCodigo(InteiroLongo codigo)
   {
      this.codigo = codigo;
   }

   public Texto getDescricao()
   {
      return descricao;
   }

   public void setDescricao(Texto descricao)
   {
      this.descricao = descricao;
   }

   public List<ExtratoVo> getListaLancamentos()
   {
      return listaLancamentos;
   }

   public void setListaLancamentos(List<ExtratoVo> listaLancamentos)
   {
      this.listaLancamentos = listaLancamentos;
   }

   public FiltroContaBancoVo getFiltro()
   {
      return filtro;
   }

   public void setFiltro(FiltroContaBancoVo filtro)
   {
      this.filtro = filtro;
   }

   public Moeda getCreditos()
   {
      return creditos;
   }

   public void setCreditos(Moeda creditos)
   {
      this.creditos = creditos;
   }

   public Moeda getDebitos()
   {
      return debitos;
   }

   public void setDebitos(Moeda debitos)
   {
      this.debitos = debitos;
   }

   public Moeda getSaldo()
   {
      return saldo;
   }

   public void setSaldo(Moeda saldo)
   {
      this.saldo = saldo;
   }

   public Texto getBancoAgenciaConta()
   {
      return bancoAgenciaConta;
   }

   public void setBancoAgenciaConta(Texto bancoAgenciaConta)
   {
      this.bancoAgenciaConta = bancoAgenciaConta;
   }

//   public EstLojaVo getEstLojaVo()
//   {
//      return estLojaVo;
//   }
//
//   public void setEstLojaVo(EstLojaVo estLojaVo)
//   {
//      this.estLojaVo = estLojaVo;
//   }

   public Inteiro getBanco()
   {
      return banco;
   }

   public void setBanco(Inteiro banco)
   {
      this.banco = banco;
   }

   public Inteiro getAgencia()
   {
      return agencia;
   }

   public void setAgencia(Inteiro agencia)
   {
      this.agencia = agencia;
   }

   public InteiroLongo getConta()
   {
      return conta;
   }

   public void setConta(InteiroLongo conta)
   {
      this.conta = conta;
   }

   public List<ContaBancoEstLojaVo> getListaContaEstLojas()
   {
      return listaContaEstLojas;
   }

   public void setListaContaEstLojas(List<ContaBancoEstLojaVo> listaContaEstLojas)
   {
      this.listaContaEstLojas = listaContaEstLojas;
   }

   public boolean isExibirListaLancamentos()
   {
      return exibirListaLancamentos;
   }

   public void setExibirListaLancamentos(boolean exibirListaLancamentos)
   {
      this.exibirListaLancamentos = exibirListaLancamentos;
   }
   
}
